<?php
//permet de faire le mapping objet-relationnel des films objet<-->films bd //-> pattern DAO (Data Access object) cf. Core J2EE Patterns 
Class FilmDAOMysql implements iDAO{
	
	
	protected $connexion;
	protected $table='film';

	public function __construct (){
		//on recupere la connexion a la bd
		$this->connexion=Connexion::getInstance()->getConnexion();
	}
	
	// on recupere tous les films
	public function getAll(){
	  $sql = "SELECT * FROM ".$this->table;
	  return $this->executeQuery($sql);
	}
	// on recupere un film par son id
	public function getById($id){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID=".$id;
	  
	  return $this->executeQuery($sql);
	}
	// on recupere un film par son titre
	public function getByName($nom){
	  $sql = "SELECT * FROM ".$this->table ." WHERE TITRE LIKE '%".$nom."%'";
	  return $this->executeQuery($sql);
	}
	
	
	
	//ici on execute une requete de type select et on renvoie un tableau composé d'objets
	public function executeQuery($sql) {
		
		$TabObjets = array();
        $result =$this->connexion->query($sql);
		$this->throwExceptionOnError();
		
		
		 if($result) {
           while($row = $result->fetch_object()){
					//on effectue le mapping entre nos objets et les lignes de la table
                	$film = new Film();
                	$film->setId($row->ID);
					//le stripslashes est utilise en reponse au addSlashes de la  classe HttpRequest
                	$film->setTitre(stripslashes($row->TITRE));
					$film->setSynopsys(stripslashes($row->SYNOPSYS));
					$film->setUrlPhoto(stripslashes($row->URL_PHOTO));
					$film->setUrlPhotoGrande(stripslashes($row->URL_PHOTO_GRANDE));
					$film->setDuree(stripslashes($row->DUREE));
					$film->setRealisateur(stripslashes($row->REALISATEUR));
					$film->setGenre(stripslashes($row->GENRE));
					$film->setTypePublic(stripslashes($row->TYPE_PUBLIC));
					$film->setDateSortie(stripslashes($row->DATE_SORTIE));
					$TabObjets[]=$film;
			}
		}
		
		return $TabObjets;
	}

	public function research($film)
	{
	
	//la fonction permet de rechercher avant un insert(si l'objet existe) ou un update (si on est bien train d'updater le bon enregistrement
		$Tab=array();
		$sql = "SELECT * FROM ".$this->table ." WHERE TITRE='".$film->getTitre()."' AND DATE_SORTIE='".$film->getDateSortie()."'";
		$Tab=$this->executeQuery($sql);
	
		switch (count($Tab)){
			
			case 0:
			//on est en mode ajout id=-1 obligatoirement si on trouve rien on peut ajouter
					return true;
					break;
			
			case 1:
				//Lors d'une modif si le resultat rendu par la requete dispose du meme id que l'objet en parametre c'est bon c'est le bon enregistrement sinon ca veut dire qu'il existe des donnes identique avec des id differents
				if ($film->getId()==$Tab[0]->getId()){
					return true;
					break;
				}
				else{
					return false;
					break;
				}
			
			default:
					return false;
					break;
		}
	}
	
	
	
//methode permettant de modifier un tuple de la table film
	public function update($film) {
		
		$sql="UPDATE ".$this->table." SET TITRE=?, SYNOPSYS=?, URL_PHOTO=?,URL_PHOTO_GRANDE=?, DUREE=?, REALISATEUR=?, GENRE=?, TYPE_PUBLIC=?, DATE_SORTIE=?  WHERE ID=?";
		//on prepare la requete
			$stmt = $this->connexion->prepare($sql);
				//on rempli avec les parametres necessaires à la requete parametree
			$stmt->bind_param('sssssssssi', $film->getTitre(), $film->getSynopsys(),$film->getUrlPhoto(),$film->getUrlPhotoGrande(),$film->getDuree(),$film->getRealisateur(),$film->getGenre(),$film->getTypePublic(),$film->getDateSortie(),$film->getId());
         		//execution de la requete
			$stmt->execute();
			
			$this->throwExceptionOnError();
			
	}
	
//methode permettant d'ajouter un tuple à la table film
	public function insert($film) {
		
		$sql="INSERT INTO ".$this->table." (TITRE ,SYNOPSYS,URL_PHOTO,URL_PHOTO_GRANDE, DUREE ,REALISATEUR,GENRE,TYPE_PUBLIC,DATE_SORTIE) VALUES(?,?,?,?,?,?,?,?,?)";
		//on prepare la requete
		$stmt = $this->connexion->prepare($sql);
			//on rempli avec les parametres necessaires à la requete parametree
		$stmt->bind_param('sssssssss', $film->getTitre(), $film->getSynopsys(),$film->getUrlPhoto(),$film->getUrlPhotoGrande(),$film->getDuree(),$film->getRealisateur(),$film->getGenre(),$film->getTypePublic(),$film->getDateSortie());
		$stmt->execute();
		$this->throwExceptionOnError();
		//on renvoie l'id insere
	    return $this->connexion->insert_id;
	
	}
	
	//supression d'un film
	public function delete($id){

		 $sql = "DELETE  FROM ".$this->table ." WHERE ID=?";
		 //on prepare
	 	 $stmt = $this->connexion->prepare($sql);
		 //on fait le lien
	     $stmt->bind_param('i', $id);
		 //on execute
	 	 $stmt->execute(); 
	 	 $this->throwExceptionOnError();
	}


	//si quelque chose c'est mal passé
	private function throwExceptionOnError(){
	
		if($this->connexion->error){
			throw new Exception('Erreur mysql'.$this->connexion->error);
		}
	}
	
	
}

?>